perm filename VISION.LAN[DOC,TOB] blob sn#073673 filedate 1973-11-19 generic text, type T, neo UTF8
00100	TOB,RBC,RHT,
00200	BLB,JAF,WAP,DBA
00300	
00400	Data Types
00500		PICTURE-TV buffer
00600			raster of bytes in memory
00700				device  (TV,file,memory)
00800				access info
00900				window ptr
01000				transform
01100		WINDOW
01200			part of a buffer
01300				PICTURE ptr
01400				x relative to PICTURE
01500				y relative to PICTURE
01600				nx
01700				ny
01800				transform ptr
01900		PIX ELEMENT indexed i,j with respect to a window
02000	
02100		TRANSFORM
02200	
02300		INVERSE TRANSFORM
02400	
02500		RAY IN SPACE
02600	
02700		MODELS
02800			WORLD MODEL-YYY
02900			PARTS MODELS TOB,BGB,RCB,RHT
03000		
03100		FOR LASER DATA
03200		FOR EDGE OPERATOR
03300		FOR CURVES-SPLINE
03400		FOR LINE DRAWINGS
03500		FOR DISPLAY-HIDDEN LINE EDGE DATA
     

00100	Operations and operators
00200	
00300	CORRELATION OPERATIONS
00400	1.  Correlation-bulk
00500		local, with small windows
00600		global, with construction of a global transform from patches
00700	2.  Feature correlation
00800		edge points
00900	
01000	EDGES AND REGIONS
01100	3.  Edge point scan
01200	4.  Corner Finder
01300	5.  Differencing
01400	6.  Contouring
01500	7.  Yoram's region grower
01600	8.  region growing
01700		global
01800		incremental
01900	9.  verification type operations
02000		edge in a direction
02100		edge at a vertex
02200		edge termination
02300	10. optimal curve edge detection
02400	11. Hueckel edge operator
02500	12. color edges
02600	
02700	CURVE TYPE OPERATORS
02800	13. curve fitting
02900	14. corner fitting
03000	15. arcs and spline
03100	16. straight line finding	slope-intercept space
03200	17. edge follower
03300	
03400	overhead functions
03500		window
03600		camera adjustment and servo
03700		calibration
03800		focus
03900	
04000	laser
04100		point laser
04200		read nonzero pts
04300		depth discontinuity
04400		slope discontinuity
04500	
04600	STEREO
04700		bulk correlation
04800		feature point
04900	TEXTURE
05000	
05100	PREDICTION
05200		DISPLAYS
05300		TRANSFORMS
     

00100	Coding conventions
00200	1.  All data structures should be dumpable and readable
00300	2.  Separate input/output from processing
00400	3.  Files should have symbolic data-type labels
00500	4.  All references to data structures should be symbolic
00600		with access functions or macros defined, in order
00700		to allow changes readily.
     

00100	From NIH vision language
00200	
00300	Major primitive image analysis operations
00400	Tape access
00500	Disk Input
00600	Disk output
00700	array allocation
00800	array printout
00900	array statistics
01000		max,min,area,centroid,weighted centroid,variance
01100	higher order moments of blobs
01200	thresholding
01300	boolean array operations
01400	boundary tracing
01500	bit counting
01600	blob extraction
01700	shifting
01800	rotation
01900	texture
02000	two-dimensional derivative
     

00100	Appendix I.  Vision primitives 
00200	
00300	This is a partial list of the visual primitives that would
00400	be "known" to the system
00500	
00600	Camera primitives
00700	
00800	cxf ← AIMING_INFO(camera number,locn in table coords,lens);
00900	
01000	Creates a record, cxf, which contains all information needed to point
01100	the specified camera at the specified point, using the specified lens
01200	and filter.  cxf will also contain a camera transform and an inverse
01300	transform, and other similar information such as might normally be
01400	found in the hand-eye picture format.  Initially, the limits of the
01500	picture are as wide as possible. 
01600	
01700	POINT_CAMERA(cxf,filter)
01800	
01900	Points & focusses a camera as specified by cxf. Filter is optional
02000	
02100	pic←TVTAKE(cxf,bits,tclip,bclip) 
02200	
02300	Takes a tv picture.  For the moment assume always get 6 bit pictures.
02400	In addition to the picture, pic gets info pointing at cxf.
02500	
02600	locn3d ← TV2W(cxf,tvcoords,plane)
02700	
02800	produces the 3D coordinates of a point lieing in the specified plane
02900	that would have the specified tv coordinates, given the specified 
03000	camera transformation.
03100	
03200	tvcs ← W2TV(cxf,locn)
03300	
03400	predicts tv coordinates.
03500	
03600	Laser primitives
03700	
03800	lsxf ← LASER_PLANE(locn,theta)
03900	
04000	lsxf gets set to a record that contains the laser pointing information
04100	and the plane equation coefficients (Ax+By+Cz+D=0, with |(A,B,C)|=1)
04200	for a laser scan at angle theta through location locn.
04300	
04400	{{ lsscn↓i }} ← LASER_TAKE(cxf,{{ lsxf↓i }})
04500	
04600	produces a list of segmented and thinned results from taking the requested
04700	laser scans with the specified cameras.
04800	
04900	lsccnlst ← GPTRIM(lsscnlst2)
05000	
05100	subtracts out the ground plane segments from the scan list
05200	
05300	correctionxf ← LASER_LOCATE(lsscnlst,object_model,feature_name)
05400	
05500	This very powerful primitive uses the specified scan list, together
05600	with the object model, to find the appropriate correction transform
05700	to transform the named feature to its actual 3-space location.
05800	An alternative form of this would allow the primitive itself
05900	to control the laser deflection apparatus and/or the tv cameras.
06000	
     

00100	Edge primitives
00200	
00300	bettermodel ← FIND_CORNER(pic,cornermodel);
00400	
00500	ellipse_coeffs ← CIRC_VIEW(cxf,plane_coeffs,centerlocn,radius)
00600	
00700	This computes the coefficients for the ellipse that one would see
00800	if one looked at a circle lieing in the named plane, with its
00900	center at the location stated and its radius as stated.
01000	This primitive may be subsumed by some other function working
01100	off one of the body representations, but it still may be independently
01200	useful.
01300	
01400	ecfs2 ← FIND_ELLIPSE(pic,ecfs,contrast,toler)
01500	
01600	Finds the best ellipse that matches the requested one. ecfs gives the
01700	model coefficients. Contrast tells whether the inside is darker or 
01800	lighter, or what.  toler tells how close a match must be.
01900	
02000	Correllation primitives.
02100	
02200	tvxf ← FEATURE_CORREL(dataframe,firstxf,search,modelframe)
02300	
02400	This primitive finds the transform (2-d) that best takes the
02500	image given by the model frame into the data frame.  These
02600	frames are essentially TV pictures, with additional information
02700	added.  Firstxf is an initial guess trasform.  Search -- which
02800	is currently not well defined -- specifies advice about a search
02900	strategy & limits.
03000	
03100	(tvxf,cremodel) ← CRE_CORREL(dataframe,firstxf,{{cre models}})
03200	
03300	Similar to FEATURE_CORREL except works with a set of cre models
03400	instead of a tv image.  This one should be good for fast initial
03500	matches.
03600	
03700	Miscellaneous Vision Primitives
03800	
03900	(top,bot,l,r) ← FIND_BLOB(pic,top,bot,left,right,
04000				xsizeup,xsizelb,ysizeub,ysizelb,
04100				contrast)
04200	
04300	Looks in the picture pic for a "blob" of the indicated
04400	contrast & size & located within the specified window.
04500	
04600	Structures
04700	
04800	Camera transforms
04900	
05000	CAMNUM(x) -- an integer giving the camera number
05100	LENSNUM(x) -- which lens
05200	PAN(x) -- degrees
05300	TILT(x) -- degrees
05400	FOCUS(x) -- focal length = dist of lens center from image plane
05500	TOP(x), BOT(x), LEFT(x), RIGHT(x) -- the TV coords of the screen limits,
05600		based on (0,0) at the raster center.  (I know HE does it another
05700		way, but this seems more sensible).  I'll let low level things
05800		worry.  NOTE: y-pos is up.
05900	LENSX(x),LENSY(x),LENSZ(x) -- locn of lens center in wc
06000	TABLEX(x),TABLEY(x) -- locn on table pierced by lens axis.
06100	CAMXF(x,i,j) -- Camera transform: (u,v,h)=CAMXF*(x,y,z,1)
06200	
06300	TV picture
06400	
06500	BITS(p) -- number of bits
06600	FILTER(p) -- filter
06700	CXF(p) -- points at camera xf used
06800	PICDV(p) -- dope vect used to calculate a pointer at the actual picture
06900	
07000	3 - locn
07100	[x,y,z,w] -- where w is scale factor.
07200	
07300	2d locn
07400	[u,v,h] -- h is scale factor
07500	
07600	laser pointing info
07700	
07800	ACOEFF(x),BCOEFF(x),CCOEFF(x),DCOEFF(x) = planecoeffs
07900	LROT(x), LTILT(x) -- coeffs that go to deflection apparatus.
08000	
08100	3d position transforms:
08200	
08300	[u,v,w,1] ← XF*[x,y,z,1] (I.E. all normalized)
08400	
08500	Useful routine
08600	3dposxf ← ROTATION(a,b,c) = xform to rotate a radians about x-axis, b-radians about
08700				y-axis. c radians about z-axis
08800	3dposxf ← TRANSLATION(a,b,c) = xform to translate x←x+a;y←y+b;z←z+c;
08900	3dposxf ← TRANSF(dx,dy,dz,da,db,dc) = TRANSLATION*ROTATION -- ie. rotate then
09000			translate.
     

00100	
00200				VISION LANGUAGE
00300	
00400	
00500	I. Primatives
00600	
00700	
00800	1	FIND_EDGE_POINTS(X1,Y1,X2,Y2;array EP)
00900	
01000		This command causes a scan of the Hueckel operator over
01100		the window defined by X1,Y1,X2, and Y2. The edge points
01200		that are found are put into array EP. For each point
01300		the following data are stored: 
01400			a) location (X,Y)
01500			b) slope with intensity direction (THETA)
01600			c) perpendicular distance (RHO) from origin of 
01700			   line defined by the direction of the edge.
01800	
01900	
02000	2	COURSE_SCAN(X1,Y1,X2,Y2;NSLITS;array EP,PEP)
02100	
02200		A course scan is made of the window defined by X1,Y1,X2, 
02300		and Y2 using NSLITS slits in both the X and Y directions
02400		and using the edge points in array EP. The X,Y and THETA
02500		of promising points are stored in array PEP.
02600	
02700	
02800	3	FOLLOW_EDGE_POINTS(X,Y;array EP,S_THETA)
02900	
03000		Starting at point X,Y follow edge points in the direction
03100		THETA until a juncture is found. Then reverse and start
03200		at X,Y in the -THETA direction. Fill array S_THETA with
03300		distance along the curve S, and slope THETA of each edge
03400		point.
03500	
03600	
03700	4	SEGMENT_POINTS(array S_THETA)
03800	
03900		The ordered set of points in array S_THETA are segmented
04000		into different curves. In this S-THETA space straight
04100		lines all have zero slope but different intercepts, circles
04200		are straight lines with slope proportional to their radius.
04300	
04400	
04500	5	FIT_TO LINE(THETA,RHO;array SEP,NOTFIT)
04600	
04700		An attempt is made to fit the edge points in array SEP
04800		to a straight line with normal coordinates near (THETA,RHO).
04900		The suggested THETA and RHO values are only approximate
05000		and an iteration process involving separation and least-squares-
05100		fitting results in  accurate values for THETA and RHO.
05200		All edge points which do not fit the line are returned in 
05300		array NOTFIT.
05400	
05500	
05600	6	FIT_TO_ARCELLIPSE(X,Y,R,ALPHA,BETA;array SEP,NOTFIT)
05700	
05800		An attempt is made to fit the edge points in array SEP
05900		to the arc of an ellipse with parameters near (X,Y,R,ALPHA,
06000		BETA). (X,Y) is the center, R is the major radius, the
06100		orientation and shape are given by the Euler angles ALPHA
06200		and BETA (the ellipse is viewed as a 2-D projection of
06300		a 3-D circular loop). An iteration process involving separation 
06400		and least-squares-fitting is done to separate "good" and 
06500		"bad" edge points and to accurately determine the parameters.
06600		All edge points	which do not fit are returned in array NOTFIT.
06700	
06800	
06900	7	FIT_TO_GENERAL_CURVE(XX1,YY1,DXDY1,XX2,YY2,DXDY2;
07000					array SEP,NOTFIT)
07100	
07200		An attempt is made to fit the edge points in array SEP
07300		to a cubic which passes through one end point (XX1,YY1) with
07400		slope (DXDY1) and passes through the other end (XX2,YY2)
07500		with slope (DXDY2). The data stored is an ordered set of 
07600		smooth points. All edge points which do not fit are 
07700		returned in array NOTFIT.
07800	
07900	
08000	8	FIND_MISSING_LINE(X,Y,DX,DY,LPERP,LPARALLEL,DEL_SLOPE)
08100	
08200		A suspected line is looked for in a thorough manner. The
08300		edge operator is run with a fine grid over the intensity
08400		points inside a rectangle with one end at X,Y extending
08500		in the direction given by the unit vector DX i + DY j.
08600		LPERP and LPARALLEL are the length of the 2 sides of the
08700		rectangle. All lines found whose slope is within DSLOPE
08800		of the slope of the unit vector are returned.
08900	
09000	
09100	9	FORM_VERTEX(TYPE_CURVE,NUMBER,WHICH_END)
09200	
09300		An attempt is made to form a juncture at the end of the 
09400		designated curve with other curves in that region by use
09500		of a local operator. The operator makes a series of tests
09600		and very conservatively forms vertices.
09700	
09800	
09900	10	TEST_TWO_LINE_VERTEX(LINE1,LINE2,TOLERANCE)
10000		
10100		The two lines are intersected and vertex criteria are tested
10200		such as the distance between the ends of the lines and the 
10300		intersection point. All other curves are ignored for this test.
10400		If the criteria are satisfied within the tolerance, a vertex is 
10500		formed. If not, the TOLERANCE that would be necessary is returned.
10600	
10700	
10800	11	TEST_THREE_LINE_VERTEX(LINE1,LINE2,LINE3,TOLERANCE1,TOLERANCE2)
10900		
11000		A least squares fit to a point is done for the intersection 
11100		of the three lines. TOLERANCE1 is compared with the maximum
11200		distance from the intersection point to a line.
11300		Other vertex criteria such as the distance between the ends 
11400		of the lines and the intersection point are compared with  
11500		TOLERANCE2. All other curves are ignored for this test.
11600		If both tolerances are satisfied a vertex is formed. If not,
11700		the necessary tolerances are returned.
11800	 
11900	
12000	12	FORM_CURVE_BOUNDED_REGION(X,Y;array EP)
12100	
12200		Attempt to form a closed region surrounding point (X,Y) using
12300		curves and vertices that border the region. Remaining edge point
12400		data in array EP are used in forming missing links and for
12500		testing to be sure that the closed region is the smallest
12600		homogeneous region surrounding the point.
12700	
12800	
12900	13	FORM_UNIFORM_INTENSITY_REGION(X,Y;array IP)
13000	
13100		Form a closed region surrounding point (X,Y) by region
13200		growing using the intensity points in array IP.
13300	
13400	
13500	
13600	II. Higher-level Operations (top_down)
13700	
13800	
13900	21	FIND_EDGE(WINDOW,THETA,INTENSITY DIRECTION,TOLERANCE)
14000	
14100		Scan the specified WINDOW and return all lines with slope
14200		equal to THETA within the TOLERANCE in order of smallest to
14300		largest deviation from THETA. If intensity direction is
14400		specified, lines with the wrong intensity direction are
14500		eliminated. (See Perkins and Binford, "Corner Finder for
14600		Visual Feedback").
14700	
14800	
14900	22	FIND_TWO_SIDED_CORNER(WINDOW,THETA1,THETA2,INTENSITY DIRECTION,
15000						TOLERANCE)
15100	
15200		Scan the specified WINDOW and return all two-sided corners
15300		which satisfy the slope and intensity specifications of the
15400		model. (See Perkins and Binford, "Corner Finder for
15500		Visual Feedback").
15600	
15700	
15800	
15900	23	FIND_THREE_SIDED_CORNER(WINDOW,THETA1,THETA2,THETA3,
16000				INTENSITY DIRECTION,TOLERANCE)
16100	
16200		Scan the specified WINDOW and return all three-sided corners
16300		which satisfy the slope and intensity specifications of the
16400		model. (See Perkins and Binford, "Corner Finder for
16500		Visual Feedback").
16600	
16700	
16800	24	FIND_HOLE_OR_TOP_OF_ROD(WINDOW,ALPHA,BETA,RADIUS,
16900				INTENSITY DIRECTION,TOLERANCE)
17000	
17100		Scan the specified WINDOW for a circular hole or top of
17200		circular rod whose projection is an ellipse with angles
17300		near ALPHA and BETA within the specified TOLERANCE.
17400		Return the location of the center (X,Y), RADIUS R, and
17500		the Euler angles. If only an arc is found, return the 
17600		beginning and ending angles.
17700	
17800	
17900	25	FIND_BOTTOM_OF_ROD(WINDOW,ALPHA,BETA,RADIUS,
18000				INTENSITY DIRECTION,TOLERANCE)
18100	
18200		Scan the specified WINDOW for the bottom of a circular rod
18300		whose projection is a particular arc of an ellipse (with angles
18400		which deviate from ALPHA and BETA within the specified TOLERANCE)
18500		that is bordered by two	by two straight lines separated by RADIUS.
18600		Return the location of the center (X,Y), RADIUS R, Euler angles 
18700		ALPHA AND BETA, and the beginning and ending angles of the arc.
18800	
18900	
19000	26	FIND_BLOB_RECTANGLE(WINDOW)
19100	
19200		Scan the window putting a rectangle around all separate blobs
19300		that are found. 
19400	
19500	
19600	27	FIND_DIFFERENCING_BLOB(WINDOW,LOOK1,LOOK2)
19700		
19800		Scan the window at two separate times LOOK1 and LOOK2.
19900		Return rectangle(s) that encloses the blob found by
20000		differencing the two pictures. This is useful for moving objects 
20100		and after some object has been dropped during assembly.
20200	
20300	
20400	
20500	
20600	
20700	
20800	
20900	
21000	
21100	
21200	----------        BASIC STRUCTURE        ---------------
21300	
21400	
21500	In order to combine these different primatives and higher-level
21600	operations, certain conventions must be established. For example,
21700	the vertex-forming module will expect a line-forming module to 
21800	store the information about each line in a definite format which
21900	it knows about. Further the vertex former must store the vertex
22000	information in a format which the corner finder knows about. This 
22100	allows the internal structure and operations of each primitive to 
22200	be independent as long as it abides by the conventions. The following 
22300	is a possible convention:
22400	
22500	
22600	Global Variables
22700	
22800		NLINES		=  number of lines present
22900		NELLIPSES	=  number of ellipses present
23000		NGENCURVES	=  number of general curves present
23100	 	NVERTEXS	=  number of vertices present 
23200		NREGIONS	=  number of regions present
23300		NEDGE1		=  number of edge points in array EP1
23400		NEDGE2		=  number of edge points in array EP2
23500		NEDGE3		=  number of edge points in array EP3
23600	
23700	
23800	Global Arrays 
23900	
24000	In the edge-point arrays such as EP1, store for each edge point
24100	the following information:
24200		X	--	X location of edge point in window coordinates
24300		Y	--	Y location of edge point in window coordinates
24400		THETA	--	angle of edge point(range is from 0 to 2π in
24500				order to include intensity direction)
24600		RHO	--	perpendicular distance of origin from line
24700				defined by direction of edge
24800	
24900	
25000	For a line array it is convenient to use a double-index array with
25100	the first index corresponding to the particular line number and
25200	the second index corresponding to the following parameters of the line.
25300	
25400		THETA	
25500		RHO	
25600		Number of edge points
25700		Length of bare line
25800		sin(THETA)
25900		cos(THETA)
26000		Directional sin(THETA)	(use in temporary comparison of line's 
26100					relation to vertex)	
26200		Directional cos(THETA)	(use in temporary comparison of line's 
26300					relation to vertex)	
26400		X coordinate of first end of bare line
26500		Y coordinate of first end of bare line
26600		X coordinate of second end of bare line
26700		Y coordinate of second end of bare line
26800		Number of the vertex which first end is connected to if any
26900		Number of the vertex which second end is connected to if any
27000		X coordinate of vertex of first end if any
27100		Y coordinate of vertex of first end if any
27200		X coordinate of vertex of second end if any
27300		Y coordinate of vertex of second end if any
27400		Number of interior vertex connections
27500		Number of first interior vertex if any
27600		Number of second interior vertex if any
27700			.........
27800		Number of last interior vertex 
27900	
28000	
28100	For an ellipse array it is convenient to use a double-index array with
28200	the first index corresponding to the particular ellipse number and
28300	the second index corresponding to the following parameters of the ellipse.
28400	
28500		X coordinate of center of ellipse formed by extending arc
28600		Y coordinate of center of ellipse formed by extending arc
28700		Major radius of ellipse formed by extending arc
28800		ALPHA -- Euler angle of rotated circle
28900		BETA  -- Euler angle of rotated circle
29000		THETA1 -- beginning angle of arc
29100		THETA2 -- ending angle of arc
29200		Intensity direction (outward,inward, or both)
29300		sin(ALPHA)
29400		cos(ALPHA)
29500		cos(BETA)
29600		Number of edge points
29700		X coordinate of first end of bare arc if any
29800		Y coordinate of first end of bare arc if any
29900		X coordinate of second end of bare arc if any
30000		Y coordinate of second end of bare arc if any
30100		X coordinate of first end of major axis of ellipse
30200		Y coordinate of first end of major axis of ellipse
30300		X coordinate of second end of major axis of ellipse
30400		Y coordinate of second end of major axis of ellipse
30500		Number of the vertex which first end is connected to if any
30600		Number of the vertex which second end is connected to if any
30700		X coordinate of vertex of first end if any
30800		Y coordinate of vertex of first end if any
30900		X coordinate of vertex of second end if any
31000		Y coordinate of vertex of second end if any
31100		Number of interior vertex connections
31200		Number of first interior vertex if any
31300		Number of second interior vertex if any
31400			.........
31500		Number of last interior vertex 
31600	
31700	
31800	For an general-curve array it is convenient to use a double-index array with
31900	the first index corresponding to the particular general-curve number and
32000	the second index corresponding to the following parameters of the general
32100	curve.
32200	
32300		Number of points along curve
32400		Number of edge points
32500		Length of curve
32600		X coordinate of first end of bare curve
32700		Y coordinate of first end of bare curve
32800		DYDX1 -- slope at first bare end
32900		X coordinate of second end of bare curve
33000		Y coordinate of second end of bare curve
33100		DYDX2 -- slope at second bare end
33200		Number of the vertex which first end is connected to if any
33300		Number of the vertex which second end is connected to if any
33400		X coordinate of vertex of first end if any
33500		Y coordinate of vertex of first end if any
33600		X coordinate of vertex of second end if any
33700		Y coordinate of vertex of second end if any
33800		X coordinate of 2nd point along curve
33900		Y coordinate of 2nd point along curve
34000		X coordinate of 3rd point along curve
34100		Y coordinate of 3rd point along curve
34200			...........
34300		X coordinate of next-to-last point along curve
34400		Y coordinate of next-to-last point along curve
34500	
34600	
34700	For a vertex array it is convenient to use a triple-index array with
34800	the first index corresponding to the particular vertex number and
34900	the (second,third) indices corresponding to the following parameters 
35000	of the vertex.
35100	
35200		(X,Y) coordinates of the vertex
35300		(Number of curves,Number of straight lines)
35400		(Number of arcs,Number of general curves)
35500		(Number of 1st curve,Number indicating type of curve)
35600		(Number of 2nd curve,Number indicating type of curve)
35700			.....................
35800		(Number of last curve,Number indicating type of curve)
35900	
36000	
36100	For a region array it is convenient to use a triple-index array with
36200	the first index corresponding to the particular region number and
36300	the (second,third) indices corresponding to the following parameters 
36400	of the region.
36500	
36600		(Area of region,Number of curves bounding region)
36700		(Average interior intensity,Variation of interior intensity)
36800		(Number of 1st vertex,Number of curves extending out of that vertex)
36900		(Number of 1st curve,Type of curve)
37000		(Number of 2nd vertex,Number of curves extending out of that vertex)
37100		(Number of 2nd curve,Type of curve)
37200			.....................
37300		(Number of last vertex,Number of curves extending out of that vertex)
37400		(Number of last curve,Type of curve)
37500	
     

00100	SOME POSSIBLE LASER MODULES:
00200	
00300	ELEMENTARY OPERATIONS:
00400	
00500	1. Manipulate laser- set laser orientation and deflection.
00600	
00700	2. Read laser image- read multiple scans seperated by a certain angle.
00800	
00900	3. POINT LASER-
01000		a) Point laser plane to pass thru a point specified in 3-d.
01100		b) Point laser to some point in image. This will use feedback and
01200		   an initial guess of approximate position of point,if availaible,
01300		   can be used advantageously.
01400		You can choose the laser orientation for either case, or a standard
01500		orientation may be used.
01600	
01700	SIMPLE PRIMITIVES:
01800	
01900	1. Segment an input trace in contiguous blobs(depth discontinuities).
02000	   Segment at slope discontinuities.(Useful for detecting corners).
02100	
02200	2. Fit curves to segmented trace. Presently can fit Quadratics or Splines.
02300		(Some knowledge about optical geometry makes fitting splines easier
02400		 than for a general case).
02500	
02600	3. Generate outlines(or parts of outlines to supplement 2-d info).
02700		As a special case can be used for edge finding.
02800	
02900	LOCATION OF SPECIFICS IN SCENE:
03000	
03100	1. Locate plane surfaces- locate all plane surfaces or particular planes.
03200	
03300	2. Locate holes-  Holes may be located with partial specifications of 
03400		the following parameters: position and orientation of hole,
03500		its size and shape.
03600		Obstructed holes will be harder. Also if inside of the hole is
03700		visible some complications in determining its size and shape occur.
03800	
03900	3. Locate Cylinders: Locate specified cylinders. Useful for locating 
04000		screws, shaft of the pump etc.
04100	
04200	
     

00100	SUMMARY OF RKN LASER PROCESSING PROGRAMS:
00200		The following is a brief summary of various routines in my programs.
00300	Some comments about their capability and possible utility are included.
00400	
00500	1. DATA ACQUISITION: Modules to take pictures exist in convenient form.
00600		There are problems of different co-ordinate systems for Hand-eye 
00700		than GJA coords.(A problem for all the other programs). 
00800		Easy to fix, but care must be taken to assure working with older files.
00900	
01000		CALIBRATION: Calibration is availiable in a form that can be used
01100			with hand-eye camera model to give depth information.
01200			There are markers on deflection assembly for initialization.
01300			If absolute depth is desired, some update scheme may be
01400			necessary. A complete calibration is lengthy and complicated.
01500	
01600	2. PRE-PROCESSING: Existing routines for thinning. Use calibration but not
01700		essential. Also segments a frame in contiguous blobs, equivalent
01800		of depth continuity detection. No slope discontinuities detected,
01900		however AHB's thinning routines may provide a good starter.
02000	
02100		BOUNDARY ORGANIZATION: As it exists, the program can link boundaries
02200		in pictures of complete scenes(i.e. where the two scans cover the 
02300		same space). Will work with one set of scans also. Uses 3-d calibration,
02400		to find intersections but can be changed to work without it.
02500		Can use a better intersection finder(using 2d memory).
02600		It likes
02700		to have good input data. Will handle some inconsistencies in input.
02800		If boundary is to be used for later processing(as I do),then efforts at
02900		improving this program may be worthwhile.
03000	
03100	3. AXIS FINDING.
03200		a) Projection Programs: provide initial axis guesses and correspondence
03300		information. Exclusively based on boundary information. They work well,
03400		but have problems with data organization( use too much space), several
03500		array bounds may be inadequate. A rewrite may be cost effective.
03600	
03700		b) Axis finding and segmentation.: Again uses boundary. Currently 
03800		3-d, but can be made availaible in 2-d. Works well if reasonable 
03900		initial guesses are fed as input. Some changes in data structures
04000		may be desirable for easier communication with higher level programs.
04100	
04200	4. HIGH LEVEL:
04300		a) Overlap: Resolves multiple descriptions. Presently does not attempt
04400		to redescribe by calling the axis finder again. Some parts can be 
04500		better described after the obscuring parts have been removed.
04600	
04700		b) Joints, description of joints:
04800		c) Matching.
04900			These are likely to be useful in analyzing complete scenes only.
05000		Some matching procedures might be applicable to locating particular 
05100		features in a scene and could be modularized. Not many specifics 
05200		known at the moment.
05300		
05400